<?php

class SolicitudpgController extends Zend_Controller_Action
{

    public function init()
    {
       if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function crearAction()
    {
         if (X\CheckAccess::PageAction('Solicitud de pago.crear')) return;
         try{
            $anhoActual= date('Y');
            $fechaIni = "$anhoActual-01-01";
            $fechaFin = "$anhoActual-12-31";
            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los egresos
            $egresos = $this->em->createQueryBuilder()
                    ->select         ('m.codigoMovimiento')
                    ->addselect      ('m.cantidad')
                    ->addselect      ('m.concepto')
                    ->addselect      ('m.monto')
                    ->addselect      ('m.observaciones')
                    ->addselect      ('c.codigoComprobante')
                    ->addselect      ('c.numeroComprobante')
                    ->addselect      ('m.fechaMovimiento')
                    ->addselect      ('t.codigoCuenta')
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('o.razonSocial')
                    ->addselect      ('o.codigoOrganizacion')
                    ->addSelect      ('doc.codigoDocumento')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->leftjoin       ('m.cuenta',                 't')
                    ->leftjoin       ('t.rubro',                  'r')
                    ->leftjoin       ('c.organizacionesExternas', 'o')
                    ->leftjoin       ('c.documento', 'doc')
                    ->where          ('m.tipoMovimiento = 2')
                    ->andWhere       ('m.solicitud is null')
                    ->andWhere       ("m.fechaMovimiento >= '$fechaIni' and m.fechaMovimiento <= '$fechaFin'")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->execute        ();


            // crear la respuesta en json
           $this->view->jsonEgresos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($egresos),
                "rows"    => $egresos
            ));
        }
        catch(Exception $e){
            $this->view->error = $e->getMessage();
        }
        
    }

    public function editarAction()
    {
         if (X\CheckAccess::PageAction('Solicitud de pago.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '1=1';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();
            


            $organizaciones = $this->em->createQueryBuilder()
                    ->select         ('o.codigoOrganizacion')
                    ->addselect      ('o.razonSocial')
                    ->from           ('Default_Model_OrganizacionesExternas', 'o')
                    ->where          ('o.tipoOrganizacion = 1') // proveedor
                    ->orWhere        ('o.tipoOrganizacion = 2') // ambos
                    ->orderBy        ('o.razonSocial', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $tipos = $this->em->createQueryBuilder()
                    ->select         ('t.codigoDocumento')
                    ->addselect      ('t.nombreDocumento')
                    ->from           ('Default_Model_Documento', 't')
                    ->orderBy        ('t.codigoDocumento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $this->view->solicitud = $this->em->createQueryBuilder()
                    ->select         ('s')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftjoin       ('s.usuario',               'u')
                    ->leftjoin       ('u.departamento',          'd')
                    ->where          ("s.codigoSolicitud = $id")
                    ->andWhere       ("s.tipoSolicitud = 2")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleResult();


              // obtener los datos
            $cuentas = $this->em->createQueryBuilder()
                    ->select         ('c.codigoCuenta')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('r.codigo')
                    ->from           ('Default_Model_Cuenta', 'c')
                    ->leftJoin       ('c.rubro',              'r')
                    ->leftJoin       ('c.presupuesto',        'p')
                    ->leftJoin       ('c.departamento',       'd')
                    ->where          ("r.egreso = true")
                    ->andWhere       ('p.periodo = '.$this->view->solicitud->getYearSolicitud())
                    ->andWhere       ("r.general = true or $where")
                    ->orderBy        ('r.nombreRubro', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // obtener los datos
             $egresos = $this->em->createQueryBuilder()
                    //Monto
                    ->select         ('m.codigoMovimiento')
                    ->addselect      ('m.cantidad')//Cantidad
                    ->addselect      ('m.concepto')//Concepto
                    ->addselect      ('m.monto')
                    ->addselect      ('m.observaciones')
                    ->addselect      ('c.codigoComprobante')
                    ->addselect      ('c.numeroComprobante')//nroCompro
                    ->addselect      ('m.fechaMovimiento')//fechaMov
                    ->addselect      ('t.codigoCuenta')//codigoCuenta
                    ->addselect      ('r.codigo')//codigoRubro
                    ->addselect      ('r.nombreRubro')//nombreRubro
                    ->addselect      ('o.razonSocial')//Provee
                    ->addselect      ('o.codigoOrganizacion')
                    ->addSelect      ('d.codigoDocumento')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('m.cuenta',                 't')
                    ->leftjoin       ('t.rubro',                  'r')
                    ->leftjoin       ('c.organizacionesExternas', 'o')
                    ->leftjoin       ('c.documento', 'd')
                    ->where          ("m.solicitud = $id")
                    ->getQuery       ()
                    ->execute        ();

             // convertir a json
            $this->view->jsonCuentas = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($cuentas),
                "rows"    => $cuentas
            ));
            $this->view->jsonOrganizaciones = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($organizaciones),
                "rows"    => $organizaciones
            ));
            $this->view->jsonEgresos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($egresos),
                "rows"    => $egresos
            ));
            $this->view->jsonTipos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($tipos),
                "rows"    => $tipos
            ));
        }
        catch(Doctrine\ORM\NoResultException $e){
            $this->view->error = 'No se encontró los datos.';
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.'.$e->getMessage();
        }
    }

    public function listarAction()
    {
         if (X\CheckAccess::PageAction('Solicitud de pago.listar')) return;

        try{
			$filtroInicial = $this->_request->getPost("filtroInicial");
			$filtroFinal   = $this->_request->getPost("filtroFinal");
			$filtroEstado  = $this->_request->getPost("filtroEstado");

			$filtroFecha = ($filtroInicial && $filtroFinal? "s.fechaSolicitud >= '$filtroInicial' and s.fechaSolicitud <= '$filtroFinal'"
						 : ($filtroInicial                ? "s.fechaSolicitud >= '$filtroInicial'"
						 : ($filtroFinal                  ? "s.fechaSolicitud <= '$filtroFinal'"
						 : '')));

			$whereEstado = "s.estadoSolicitud = " . ($filtroEstado ? $filtroEstado : "1");

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los datos
            $solicitudes = $this->em->createQueryBuilder()
                    ->select         ('s.codigoSolicitud')
                    ->addselect      ('s.fechaSolicitud')
                    ->addselect      ('s.numeroSolicitud')
                    ->addselect      ('s.monto')
                    ->addselect      ('s.concepto')
                    ->addselect      ('s.observaciones')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftJoin       ('s.usuario',               'u')
                    ->leftJoin       ('u.departamento',          'd')
                    ->where          ('s.tipoSolicitud = 2')
                    ->andWhere       ($where)
					->andWhere       ($whereEstado)
					->andWhere       ($filtroFecha)
                    ->orderBy        ('s.fechaSolicitud', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (20)
                    ->getQuery       ()
                    ->execute        ();
            
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(s.codigoSolicitud)')
                    ->from     ('Default_Model_Solicitud', 's')
                    ->leftJoin ('s.usuario',               'u')
                    ->leftJoin ('u.departamento',          'd')
                    ->where    ('s.tipoSolicitud = 2')
                    ->andWhere ($where)
					->andWhere ($whereEstado)
					->andWhere ($filtroFecha)
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $solicitudes
            ));

        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function ajaxListarAction()
    {
 //        if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.listar')) return;
        try{
            // obtener los parametros
            $start = $this->_getParam("start");
            $limit = $this->_getParam("limit");
            $sort  = $this->_getParam("sort");
            $dir   = $this->_getParam("dir");

			$filtroInicial = $this->_getParam("filtroInicial");
			$filtroFinal   = $this->_getParam("filtroFinal");
			$filtroEstado  = $this->_getParam("filtroEstado");

			$filtroFecha = ($filtroInicial && $filtroFinal  ? "s.fechaSolicitud >= '$filtroInicial' and s.fechaSolicitud <= '$filtroFinal'"
						   : ($filtroInicial                ? "s.fechaSolicitud >= '$filtroInicial'"
						   : ($filtroFinal                  ? "s.fechaSolicitud <= '$filtroFinal'"
						   : '')));

			$whereEstado = "s.estadoSolicitud = " . ($filtroEstado ? $filtroEstado : "1");

            // si está vacío
            $sort = isset($sort)? $sort : 'fechaSolicitud';
            $dir  = isset($dir)?  $dir  : 'asc';

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            // obtener los datos
            $solicitudes = $this->em->createQueryBuilder()
                    ->select         ('s.codigoSolicitud')
                    ->addselect      ('s.fechaSolicitud')
                    ->addselect      ('s.monto')
                    ->addselect      ('s.numeroSolicitud')
                    ->addselect      ('s.concepto')
                    ->addselect      ('s.observaciones')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftJoin       ('s.usuario',               'u')
                    ->leftJoin       ('u.departamento',          'd')
                    ->where          ('s.tipoSolicitud = 2')
                    ->andWhere       ($where)
                    ->andWhere       ($whereEstado)
                    ->andWhere       ($filtroFecha)
                    ->orderBy        ("s.$sort", $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();


            $cantidad = $this->em->createQueryBuilder()
                    ->select         ('count(s.codigoSolicitud)')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftJoin       ('s.usuario',               'u')
                    ->leftJoin       ('u.departamento',          'd')
                    ->where          ('s.tipoSolicitud = 2')
                    ->andWhere       ($where)
					->andWhere       ($whereEstado)
					->andWhere       ($filtroFecha)
                    ->getQuery       ()
                    ->getSingleScalarResult();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $solicitudes
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al cargar los datos.');
        }
    }

    public function ajaxCrearAction()
    {
          if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.crear')) return;
          
          try{

            $primeravez=false;
            // obtener los parametros
            $fechaSolicitud     = $this->_request->getPost('fechaSolicitud');
            $monto              = $this->_request->getPost('monto');
            $concepto           = $this->_request->getPost('concepto');
            $justificacion      = $this->_request->getPost('justificacion');
            $ordenPago          = $this->_request->getPost('ordenPago');
            $gridRows           = $this->_request->getPost('gridRows');

            $anho=explode('/',$fechaSolicitud);
            
            try{

            $numeroSolicitud = $this->em->createQueryBuilder()
                    ->select   ('s.numeroSolicitud')
                    ->from     ('Default_Model_Solicitud', 's')
                    ->where    ("s.numeroSolicitud is not null")
                    ->orderBy  ('s.codigoSolicitud','desc')
                    ->getQuery ()
                    ->setMaxResults(1)
                    ->getSingleResult();
      
            }catch(Exception $e){
                $numeroSolicitud="1/$anho[2]";
                $primeravez=true;
            }
                  
                  
            //si ya existe algun numero de solicitud
            if($numeroSolicitud && $primeravez==false){
                $numeroActual= $numeroSolicitud['numeroSolicitud'];
                $ultimo= explode('/',$numeroActual);
                if ($anho[2] == $ultimo[1]){
                    $numero=intval($ultimo[0])+1;
                    $ano=$ultimo[1];
                    $numeroSolicitud="$numero/$ano";
                }
                else{ //anho no coincide, comienza otro de nuevo
                     $numeroSolicitud="1/$anho[2]";
                }
            }

            // obtener los datos
            $usuario      = $this->em->find('Default_Model_Usuario', X\Session::codigoUsuario());
            $rows         = Zend_Json::decode($gridRows);

            // verificar los datos
            if (count($rows) == 0){
                X\Msg::Failure('Por lo menos un movimiento.'); return;
            }
            
            // crear
            $solicitud = new Default_Model_Solicitud;
            $solicitud->setFechaSolicitud ($fechaSolicitud);
            $solicitud->setNumeroSolicitud($numeroSolicitud);
            $solicitud->setMonto          ($monto);
            $solicitud->setConcepto       ($concepto);
            $solicitud->setObservaciones  ($justificacion); //campo OBS como justificacion
            $solicitud->setEstadoSolicitud(1);
            $solicitud->setTipoSolicitud  (2);
            $solicitud->setChequeOrden    ($ordenPago);
            $solicitud->setUsuario        ($usuario);

            
            // crear movimientos
            foreach($rows as $row){
                
                $movimiento = $this->em->find('Default_Model_Movimiento', $row['codigoMovimiento']);
                $movimiento->setSolicitud($solicitud);

                $solicitud->addMovimiento($movimiento);
            }

            // guardar
            $this->em->persist($solicitud);
            $this->em->flush();

            X\Msg::Success('La solicitud se ha creado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear la solicitud.'.$e->getMessage());
        }
        
    }

    public function ajaxEditarAction()
    {
        
        if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.editar')) return;
 
        try{
            
            // obtener los parametros
            $codigoSolicitud    = $this->_request->getPost('codigoSolicitud');
            $fechaSolicitud     = $this->_request->getPost('fechaSolicitud'); //ver si cambia al edit
            $monto              = $this->_request->getPost('monto');
            $concepto           = $this->_request->getPost('concepto');
            $justificacion      = $this->_request->getPost('justificacion');
            $ordenPago          = $this->_request->getPost('ordenPago');
            $gridRows           = $this->_request->getPost('gridRows');
            
            // obtener los datos
            //no se modifica el usuario que creo la solicitud.
            
           
            $rows         = Zend_Json::decode($gridRows);
            $solicitud  = $this->em->createQueryBuilder()
                    ->select         ('s')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftjoin       ('s.usuario',               'u')
                    ->leftjoin       ('u.departamento',          'd')
                    ->where          ("s.codigoSolicitud = $codigoSolicitud")
                    ->getQuery       ()
                    ->getSingleResult();


            // verificar los datos
            if (count($rows) == 0){
                X\Msg::Failure('Por lo menos un movimiento.'); return;
            }

            // update
            $solicitud->setFechaSolicitud ($fechaSolicitud);
            $solicitud->setMonto          ($monto);
            $solicitud->setConcepto       ($concepto);
            $solicitud->setObservaciones  ($justificacion); //campo OBS como justificacion
            $solicitud->setEstadoSolicitud(1);
            $solicitud->setTipoSolicitud  (2);
            $solicitud->setChequeOrden    ($ordenPago);


            //desasociar movimientos viejos
            foreach($solicitud->getMovimientos() as $movimiento){
                $movimiento->setSolicitud(null);
                $solicitud->getMovimientos()->removeElement($movimiento);
            }
            
            // asociar nuevos movimientos
            foreach($rows as $row){
                $cuenta     = $this->em->find('Default_Model_Cuenta',     $row['codigoCuenta']);
                $movimiento = $this->em->find('Default_Model_Movimiento', $row['codigoMovimiento']);
                $documento  = $this->em->find('Default_Model_Documento',  $row['codigoDocumento']);
                $comprobante= $movimiento->getComprobante();
                
                $movimiento->setSolicitud    ($solicitud);
                $movimiento->setConcepto     ($row['concepto']);
                $movimiento->setObservaciones($row['observaciones']);
                $movimiento->setCantidad     ($row['cantidad']);
                $movimiento->setMonto        ($row['monto']);
                $movimiento->setCuenta       ($cuenta);
                foreach($comprobante->getMovimientos() as $mov){
                    $mov->setFechaMovimiento($row['fechaMovimiento']);
                }

                $comprobante->setFechaComprobante ($row['fechaMovimiento']);
                $comprobante->setNumeroComprobante($row['numeroComprobante']);
                $comprobante->setDocumento        ($documento);
                
                $org = $this->em->find('Default_Model_OrganizacionesExternas', $row['codigoOrganizacion']);
                $comprobante->setOrganizacionesExternas($org);
                
                $solicitud->addMovimiento($movimiento);
            }

            // guardar
            $this->em->persist($solicitud);
            $this->em->flush();

            X\Msg::Success('La solicitud se ha actualizado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear la solicitud.'.$e->getMessage());
        }
    }

    public function ajaxEliminarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.eliminar')) return;
         try{
           
            $id = $this->_request->getPost('id');

            // obtener los datos
            $solicitud  = $this->em->createQueryBuilder()
                    ->select         ('s')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftjoin       ('s.usuario',               'u')
                    ->leftjoin       ('u.departamento',          'd')
                    ->where          ("s.codigoSolicitud = $id")
                    ->getQuery       ()
                    ->getSingleResult();

            if ($solicitud->getEstadoSolicitud()==2){
                  //Restar el monto ejecutado de las cuentas y calcular el nvo monto actual
                foreach($solicitud->getMovimientos() as $movimiento){
                    $cuenta= $movimiento->getCuenta();
                    $cuenta->setMontoEjecutado( $cuenta->getMontoEjectuado() - $movimiento->getMonto()  );
                    $cuenta->setMontoActual( $cuenta->getMontoInicial() - $cuenta->getMontoEjectuado() );
//                    $montoEjecutado = $cuenta->getMontoEjectuado() - $movimiento->getMonto();
//                    $cuenta->setMontoEjecutado( $montoEjecutado );
//                    $cuenta->setMontoActual($cuenta->getMontoInicial() - $montoEjecutado);
                }
                $solicitud->setEstadoSolicitud(3);
            }

              //desasociar movimientos
            foreach($solicitud->getMovimientos() as $movimiento){
                $movimiento->setSolicitud(null);
                $solicitud->getMovimientos()->removeElement($movimiento);
            }

            // eliminar el objeto
            if ($solicitud->getEstadoSolicitud()==1){
                $this->em->remove($solicitud);
            }
            $this->em->flush();

            X\Msg::Success('La solicitud de pago se ha eliminado con éxito.');
        }
        catch(Doctrine\ORM\NoResultException $e){
            X\Msg::Failure('No se encontró los datos.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar la solicitud de pago.');
        }
    }

    public function ajaxEgresosAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.crear')) return;

        try{
          
             $fechaSolicitud = $this->_request->getPost('fechaSolicitud');
            
             $explode = explode('T', $fechaSolicitud);   $explode = $explode[0];
             $explode = explode('-', $explode); $anhoActual = $explode[0];
          
             $fechaIni = "$anhoActual-01-01";
             $fechaFin = "$anhoActual-12-31";         

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            
           $egresos = $this->em->createQueryBuilder()
                    ->select         ('m.codigoMovimiento')
                    ->addselect      ('m.cantidad')
                    ->addselect      ('m.concepto')
                    ->addselect      ('m.monto')
                    ->addselect      ('m.observaciones')
                    ->addselect      ('c.codigoComprobante')
                    ->addselect      ('c.numeroComprobante')
                    ->addselect      ('do.codigoDocumento')
                    ->addselect      ('m.fechaMovimiento')
                    ->addselect      ('t.codigoCuenta') //para el combo editable
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('o.razonSocial')
                    ->addselect      ('o.codigoOrganizacion')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->leftjoin       ('m.comprobante',            'c')
                    ->leftjoin       ('c.usuario',                'u')
                    ->leftjoin       ('u.departamento',           'd')
                    ->leftjoin       ('m.cuenta',                 't')
                    ->leftjoin       ('t.rubro',                  'r')
                    ->leftjoin       ('c.organizacionesExternas', 'o')
                    ->leftjoin       ('c.documento', 'do')
                    ->where          ('m.tipoMovimiento = 2')
                    ->andWhere       ('m.solicitud is null')
                    ->andWhere       ("m.fechaMovimiento >= '$fechaIni' and m.fechaMovimiento <= '$fechaFin'")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->execute        ();



            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($egresos),
                "rows"    => $egresos
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al cargar los datos.'.$e->getMessage());
        }
    }

    public function ajaxCaneditAction()
    {
         try{
            // obtener los parametros
            $id = $this->_request->getPost('id');

            // calcular el permiso
            if      (X\Session::esDirectorGral()) $where = '';
            else if (X\Session::esDirectorDpto()) $where = 'd.codigoDepartamento=' . X\Session::codigoDepartamento();
            else                                  $where = 'u.codigoUsuario='      . X\Session::codigoUsuario();

            $solicitud = $this->em->createQueryBuilder()
                    ->select         ('s')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftjoin       ('s.usuario',               'u')
                    ->leftjoin       ('u.departamento',          'd')
                    ->where          ("s.codigoSolicitud = $id")
                    ->andWhere       ("s.tipoSolicitud = 2")
                    ->andWhere       ($where)
                    ->getQuery       ()
                    ->getSingleResult();

            if ($solicitud->getEstadoSolicitud()!=1){
                X\Msg::Failure('Esta solicitud ya fue confirmada: no se puede modificar!');
                return;
            }
            else{
                X\Msg::Success('');
            }
         }catch(Exception $e){
             X\Msg::Failure('Error en el servidor');
         }
    }

    public function validarRechazarAction()
    {
         if (X\CheckAccess::PageAction('Solicitud de pago.validar-rechazar')) return;
         try{
            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            //agregar al array un elemento que para la opcion de todos los usuarios
            $Todos = array('codigoDepartamento'=>0, 'nombreDepartamento'=>'Todos');
            array_unshift($departamentos, $Todos);

            // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function ajaxFiltroAction()
    {
         if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.validar-rechazar')) return;

        try{
            // obtener los parametros
            $start = $this->_getParam("start");
            $limit = $this->_getParam("limit");
            $sort  = $this->_getParam("sort");
            $dir   = $this->_getParam("dir");

            // si está vacío
            $sort = isset($sort)? $sort : 'fechaSolicitud';
            $dir  = isset($dir)?  $dir  : 'asc';
            
            // obtener los parametros
            $filtroInicial      = $this->_request->getPost("filtroInicial");
            $filtroFinal        = $this->_request->getPost("filtroFinal");
            $filtroDepartamento = $this->_request->getPost("filtroDepartamento");
            $filtroEstado       = $this->_request->getPost("filtroEstado");

            //crear los filtros
            $filtroFecha = ($filtroInicial && $filtroFinal? "s.fechaSolicitud >= '$filtroInicial' and s.fechaSolicitud <= '$filtroFinal'"
                         : ($filtroInicial                ? "s.fechaSolicitud >= '$filtroInicial'"
                         : ($filtroFinal                  ? "s.fechaSolicitud <= '$filtroFinal'"
                         : '')));
            
            $filtroDpto = ($filtroDepartamento? "d.codigoDepartamento = '$filtroDepartamento'" : '');

            $filtroState =($filtroEstado? "s.estadoSolicitud = '$filtroEstado'" : 's.estadoSolicitud=1 or s.estadoSolicitud=2');

            // obtener los datos
            
            $cantidad = $this->em->createQueryBuilder()
                    ->select         ('count(s.codigoSolicitud)')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftJoin       ('s.usuario',               'u')
                    ->leftJoin       ('u.departamento',          'd')
                    ->where          ('s.tipoSolicitud = 2')
                    ->andWhere       ($filtroFecha)
                    ->andWhere       ($filtroDpto)
                    ->andWhere       ($filtroState)
                    ->getQuery       ()
                    ->getSingleScalarResult();
            
            if ($start > $cantidad){
                $start = intval($cantidad) - (intval($cantidad) % 9);
            }

            $solicitudes = $this->em->createQueryBuilder()
                    ->select         ('s.codigoSolicitud')
                    ->addselect      ('s.fechaSolicitud')
                    ->addselect      ('s.numeroSolicitud')
                    ->addselect      ('s.chequeOrden')
                    ->addselect      ('s.monto')
                    ->addselect      ('s.concepto')
                    ->addselect      ('s.observaciones')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->leftJoin       ('s.usuario',               'u')
                    ->leftJoin       ('u.departamento',          'd')
                    ->where          ('s.tipoSolicitud = 2')
                    ->andWhere       ($filtroFecha)
                    ->andWhere       ($filtroDpto)
                    ->andWhere       ($filtroState)
                    ->orderBy        ("s.$sort", $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  (9)
                    ->getQuery       ()
                    ->execute        ();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $solicitudes
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los datos.');
        }
    }

    public function ajaxValidarAction()
    {
         if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.validar-rechazar')) return;
         try{

            $id = $this->_request->getPost('id');
            

            // obtener los datos
            $solicitud  = $this->em->createQueryBuilder()
                    ->select         ('s')
                    ->from           ('Default_Model_Solicitud', 's')
                    ->where          ("s.codigoSolicitud = $id")
                    ->getQuery       ()
                    ->getSingleResult();

            if( $solicitud->getEstadoSolicitud()== 2 ){
                  X\Msg::Failure('La solicitud ya fue confirmada!'); return;
            }
            
            $solicitud->setEstadoSolicitud(2);

            //Sumar el monto ejecutado de las cuentas y calcular el nvo monto actual
            foreach($solicitud->getMovimientos() as $movimiento){
                $cuenta= $movimiento->getCuenta();
                  $cuenta->setMontoEjecutado( $cuenta->getMontoEjectuado() + $movimiento->getMonto()  );
                  $cuenta->setMontoActual( $cuenta->getMontoInicial() - $cuenta->getMontoEjectuado() );
           //     $montoEjecutado = $cuenta->getMontoEjectuado() + $movimiento->getMonto();
           //     $cuenta->setMontoEjecutado( $montoEjecutado );
           //     $cuenta->setMontoActual($cuenta->getMontoInicial() - $montoEjecutado);
                 // si la cuenta no tiene monto suficiente
                if ($cuenta->getMontoActual() < 0){
                //    X\Msg::Failure('Monto insuficiente para ejecutar la solicitud.'); return;
                }
            }

            // eliminar el objeto
            $this->em->persist($solicitud);
            $this->em->flush();

            X\Msg::Success('La solicitud de pago se ha confirmado con éxito.');
        }
        catch(Doctrine\ORM\NoResultException $e){
            X\Msg::Failure('No se encontró los datos.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al confirmar la solicitud de pago.');
        }
    }

    public function verPdfAction()
    {
        //NO DESCOMENTAR
    //    if (X\CheckAccess::AjaxAction($this, 'Solicitud de pago.listar')) return;
        
        try{ //throw new Exception();
            $id = $this->_request->getQuery('id');
            
            $solicitud = $this->em->find('Default_Model_Solicitud',$id);


            $egresos= $this->em->createQueryBuilder()
            ->select         ('m.codigoMovimiento')
            ->addselect      ('m.fechaMovimiento')
            ->addselect      ('m.cantidad')
            ->addselect      ('m.monto')
            ->addselect      ('m.concepto')
            ->addselect      ('m.observaciones')
            ->addselect      ('r.codigo')
            ->from           ('Default_Model_Movimiento','m')
            ->leftJoin       ('m.cuenta'                ,'c')
            ->leftJoin       ('c.rubro'                 ,'r')
            ->where          ("m.solicitud = $id")
            ->orderBy        ('r.codigo', 'asc')
            ->getQuery       ()
            ->execute        ();

            $De = $solicitud->getUsuario()->getDepartamento()->getDirector();

            $sedeCa= $this->em->createQueryBuilder()
                    ->select         ('c.valorConfiguracion')
                    ->from           ('Default_Model_Configuracion', 'c')
                    ->where          ("c.nombreConfiguracion = 'SedeCa'")
                    ->getQuery       ()
                    ->getSingleResult();
            $sedeCa=$sedeCa['valorConfiguracion'];
            

            if($solicitud->getEstadoSolicitud()==1){
                $confirmado=0;
                $A= $this->em->createQueryBuilder()
                    ->select         ('c.valorConfiguracion')
                    ->from           ('Default_Model_Configuracion', 'c')
                    ->where          ("c.nombreConfiguracion = 'Director Administrativo'")
                    ->getQuery       ()
                    ->getSingleResult();
                $A=$A['valorConfiguracion'];
            }
           
            if($solicitud->getEstadoSolicitud()==2){
                $confirmado=1;
                $A= $this->em->createQueryBuilder()
                    ->select         ('c.valorConfiguracion')
                    ->from           ('Default_Model_Configuracion', 'c')
                    ->where          ("c.nombreConfiguracion = 'Director Gral'")
                    ->getQuery       ()
                    ->getSingleResult();
                $A=$A['valorConfiguracion'];
                $De= $this->em->createQueryBuilder()
                    ->select         ('c.valorConfiguracion')
                    ->from           ('Default_Model_Configuracion', 'c')
                    ->where          ("c.nombreConfiguracion = 'Director Administrativo'")
                    ->getQuery       ()
                    ->getSingleResult();
                $De=$De['valorConfiguracion'];

                $sedeRe= $this->em->createQueryBuilder()
                    ->select         ('c.valorConfiguracion')
                    ->from           ('Default_Model_Configuracion', 'c')
                    ->where          ("c.nombreConfiguracion = 'SedeRe'")
                    ->getQuery       ()
                    ->getSingleResult();
                $sedeRe=$sedeRe['valorConfiguracion'];
            }
           
          
             //create new pdf
            $pdf = new Zend_Pdf();
            // create A4 page
            $page = X\Pdf::createPdfPage();//'595:842'
            // define font resource
            $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES_BOLD);
            $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES);
            $page->setFont($font, 18)
                ->drawText('SOLICITUD DE PAGO', 210, 710);
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(210, 708, 398, 708);//398
            // Encabezado
            $page->setFont($font, 12)
                ->drawText('A :', 35, 685)
                ->drawText('De :', 35, 645)
                ->drawText('Nro. de Solicitud :', 35, 608)
                ->drawText('Fecha :', 35, 582)
                ->drawText('Solicitamos el', 35, 555)
                ->drawText('pago a nombre de :', 35, 545)
                ->drawText('El pago deberá', 35, 515,'UTF-8')
                ->drawText('ser por un total de :', 35, 505)
                ->drawText('El gasto implicado', 35, 475)
                ->drawText('es en concepto de :', 35, 465)
                ->drawText('Justificación :', 35, 415,'UTF-8')
                ->drawText('Solicitamos además que sea imputado a :', 35, 375,'UTF-8');
  
            //datos encabezado
            $page->setFont($font2, 12)->drawText($A   , 150, 685,'UTF-8');
            $page->setFont($font2, 12)->drawText($confirmado?$sedeRe:$sedeCa, 150, 670,'UTF-8');
            $page->setFont($font2, 12)->drawText($De  , 150, 645,'UTF-8');
            $page->setFont($font2, 12)->drawText($sedeCa, 150, 630,'UTF-8')
                ->drawText($solicitud->getNumeroSolicitud(), 150, 608)
                ->drawText($solicitud->getFechaSolicitud(), 150, 582)
                ->drawText($solicitud->getChequeOrden(), 150, 545,'UTF-8')
                ->drawText(number_format($solicitud->getMonto(),0,',','.').' Gs.', 150, 505);

                $text = wordwrap($solicitud->getConcepto(), 80);
                $token = strtok($text, "\n"); $y=465;
                while ($token != false){
                    $page->setFont($font2, 12)->drawText($token, 150, $y,'UTF-8');
                    $token = strtok("\n"); $y = $y-12;
                }
                $text = wordwrap($solicitud->getObservaciones(), 80);
                $token = strtok($text, "\n"); $y=415;
                while ($token != false){
                    $page->setFont($font2, 12)->drawText($token, 150, $y,'UTF-8');
                    $token = strtok("\n"); $y = $y-12;
                }

           $pdf->pages[] = $page;
           $pageNumber=0;
           $codigoRubro='';
           $i=355;
           $rubroContinua=1;
           $montopag=0;
           $montorubro = 0;
           $montopos=0;
           foreach($egresos as $mov){

               $movimiento = $this->em->find('Default_Model_Movimiento',$mov['codigoMovimiento']);
               $cuenta = $movimiento->getCuenta();
               $rubro  = $cuenta->getRubro();

               if(strcmp($codigoRubro, $rubro->getCodigo())!=0){ //nuevo rubro a agrupar                 
                    if(strcmp($codigoRubro, '')!=0){        //nuevo monto a poner
                         $pdf->pages[$montopag]->setFont($font, 10)
                                    ->drawText(number_format($montorubro,0,',','.'), 480, $montopos);
                         $i=$i-20;
                         $rubroContinua=0; //recien puse el monto, por lo tanto nuevo rubro
                    }
                    $codigoRubro = $rubro->getCodigo() ;
                    $montorubro = 0;
                    if($i-90>80){  
                        $montopos = $i-15;
                        $montopag= $pageNumber;
                    }
                    else{
                        $montopos = 790-15;
                        $montopag= $pageNumber+1;
                    }

                    if($i-90>80){ //cabecera para rubro nuevo en la misma hoja

                        $page->setFont($font2, 12)
                            ->drawText('Rubro', 47, $i)
                            ->drawText('Descripción', 155, $i,'UTF-8')
                            ->drawText('Monto', 480, $i);

                        $i-=15;

                        //datos rubro
                        $page->setFont($font,  10)->drawText($rubro->getCodigo(), 47, $i);

                        //Para imprimir la descripcion se salta cada 40 carcateres y se actualiza $i
                        //para mantener el formato
                        $text = wordwrap($rubro->getNombre(), 40);
                        $token = strtok($text, "\n");
                        while ($token != false){
                            $page->setFont($font2, 12)->drawText($token, 155, $i,'UTF-8');
                            $token = strtok("\n"); $i = $i-12;
                        }
                          
                            //movimientos
                        $i-=15;
                        $page->setFont($font2, 10)->drawText('Detalle de gasto(s):', 50, $i);
                        $i-=20;
                        $page->setFont($font2, 10)
                            ->drawText('Fecha', 60, $i)
                            ->drawText('Cant.', 122, $i)
                            ->drawText('Concepto', 155, $i)
                            ->drawText('Monto', 345, $i)
                            ->drawText('Nro.', 410, $i)
                            ->drawText('Observación', 450, $i,'UTF-8');

                        $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                             ->drawLine(50, $i+10, ($page->getWidth()-50), $i+10);
                        $i-=5;
                        $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                             ->drawLine(50, $i, ($page->getWidth()-50), $i);
                        $i-=10;
                   }
                   else{
                       $i-=90;
                   }
                    
               }
               
                 //si se aproxima el fin de pagina, nueva pagina
                if($i <= 80){
                    // create A4 page
                    $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4); //'595:842'

                    // agregar pagina al pdf
                    $pdf->pages[] = $page;
                    $i=790;
                    $pageNumber++;
               }

                //Al ser dif de la 1ra pagina no se pone header
                if($pageNumber>0 && $i==790){
                    if(!$rubroContinua){
                        $page->setFont($font2, 12)
                            ->drawText('Rubro', 47, $i)
                            ->drawText('Descripción', 155, $i,'UTF-8')
                            ->drawText('Monto', 480, $i);

                        $i-=15;

                        //datos rubro
                        $page->setFont($font,  10)->drawText($rubro->getCodigo(), 47, $i);

                        //Para imprimir la descripcion se salta cada 40 carcateres y se actualiza $i
                        //para mantener el formato
                        $text = wordwrap($rubro->getNombre(), 40);
                        $token = strtok($text, "\n");
                        while ($token != false){
                            $page->setFont($font2, 12)->drawText($token, 155, $i,'UTF-8');
                            $token = strtok("\n"); $i = $i-12;
                        }
                            
                            //movimientos
                    }
                    $i-=15;
                    $page->setFont($font2, 10)->drawText('Detalle de gasto(s):', 50, $i);
                    $i-=20;
                    $page->setFont($font2, 10)
                        ->drawText('Fecha', 60, $i)
                        ->drawText('Cant.', 122, $i)
                        ->drawText('Concepto', 155, $i)
                        ->drawText('Monto', 345, $i)
                        ->drawText('Nro.', 410, $i)
                        ->drawText('Observación', 450, $i,'UTF-8');

                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                         ->drawLine(50, $i+10, ($page->getWidth()-50), $i+10);
                    $i-=5;
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                         ->drawLine(50, $i, ($page->getWidth()-50), $i);
                    $i-=10;
                }

                $concepto = substr($movimiento->getConcepto(), 0, 35);
                $obs = substr($movimiento->getObservaciones(), 0, 24);
                
                    //datos movimiento
                $page->setFont($font2, 10)->drawText($movimiento->getFechaMovimiento(), 60, $i);
                $page->setFont($font2, 10)
                    ->drawText(number_format($movimiento->getCantidad(),0,',','.'), 145-$this->getWidth($movimiento->getCantidad()), $i)
                    ->drawText( $concepto , 155, $i,'UTF-8');
                $page->setFont($font2, 10)
                    ->drawText(number_format($movimiento->getMonto(),0,',','.'),375-$this->getWidth($movimiento->getMonto()), $i)
                    ->drawText($movimiento->getComprobante()->getNumeroComprobante(), 430-$this->getWidth($movimiento->getComprobante()->getNumeroComprobante()), $i)
                    ->drawText($obs, 450, $i,'UTF-8');

                $montorubro+=$movimiento->getMonto();

                $i=$i-12;
                $rubroContinua=1;
          }
          //monto del ultimo rubro
          $pdf->pages[$montopag]->setFont($font, 10)->drawText(number_format($montorubro,0,',','.'), 480, $montopos);
          
           $pageNumber2=1; $pageNumber+=1;
           foreach($pdf->pages as $p){
                 $p->setFont($font2, 10)
                   ->drawText(date('d/m/Y H:i:s'),  430, 50);
                 $p->setFont($font2, 10)
                   ->drawText("$pageNumber2/$pageNumber",  500, 40);
                 $pageNumber2++;
           }
         
           $p->setFont($font2, 10)->drawText($De  , 220, 60,'UTF-8');
           $p->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                         ->drawLine(215, 70, (215+$this->getTextWidth($De,$font2,10)), 70);
          
          $name='SolicitudPago.pdf';
          $this->getResponse()->setHeader('Content-type', "application/x-pdf", true);
          $this->getResponse()->setHeader('Content-disposition', "name=$name", true);
          $this->getResponse()->setBody($pdf->render());
        }
        catch(Exception $e){
           $pdf = new Zend_Pdf();
            // create A4 page
           $page = X\Pdf::createPdfPage();//'595:842'
            // define font resource
           $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES_BOLD);
           $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES);

           $page->setFont($font, 18)
                ->drawText($e->getMessage(), 210, 710);

           $pdf->pages[] = $page;
           
           $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
           $this->getResponse()->setHeader('Content-disposition', "inline; filename=Error.pdf", true);
           $this->getResponse()->setBody($pdf->render());
        }
    }

    public function getWidth($text)
    {
        $sum = 0;
        $array = str_split($text);

        foreach($array as $char)
        {
            if ($char == ',') $sum += 1.6;
            else              $sum += 5.3;
        }
        return $sum;
    }

    public function getTextWidth($text, Zend_Pdf_Resource_Font $font, $font_size)
    {
	$drawing_text = iconv('', 'UTF-16BE', $text);
	$characters    = array();
	for ($i = 0; $i < strlen($drawing_text); $i++) {
		$characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]);
	}
	$glyphs        = $font->glyphNumbersForCharacters($characters);
	$widths        = $font->widthsForGlyphs($glyphs);
	$text_width   = (array_sum($widths) / $font->getUnitsPerEm()) * $font_size;
	return $text_width;
    }

}

